#include #include #include #include using namespace std; int m,n; int sgt2[400400]; int sgt[400400]; int mx[100100]; int mn[100100]; long long fact[200100]; long long inv[200100]; long long mod=1000000007; int readPosIntLn(){ int x=0; int cnt=0; int fi=-1; while(true){ char g=getchar(); if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(!(cnt>10 || ( cnt==10 && fi>1) )); } else if(g=='\n'){ return x; } else { assert(false); } } } int readPosIntSpace(){ int x=0; int cnt=0; int fi=-1; while(true){ char g=getchar(); if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(!(cnt>10 || ( cnt==10 && fi>1) )); } else if(g==' '){ return x; } else { assert(false); } } } string readStringLn(){ string ret=""; while(true){ char g=getchar(); if( ('a'<=g && g<='z') || ('A'<=g && g<='Z')){ ret+=g; } else if(g=='\n'){ return ret; } else { assert(false); } } } void readEof(){ char g=getchar(); assert(g==EOF); } long long pw(long long n, long long k){ long long ret=1; long long p2=n; while(k>0){ if(k%2){ ret*=p2; ret%=mod; } k/=2; p2*=p2; p2%=mod; } return ret; } long long invv(long long x){ return pw(x,mod-2); } long long C(long long n, long long k){ if(n<0 || k<0 || k>n){ return 0; } long long ret=(fact[n] * inv[k] )%mod; ret *= inv[n-k]; ret%=mod; return ret; } void build(int nd,int l,int r){ if(l==r){ sgt[nd]=mx[l]; return; } int mid=(r+l)/2; build(2*nd,l,mid); build(2*nd+1,mid+1,r); sgt[nd]=max(sgt[2*nd],sgt[2*nd+1]); } int query(int nd,int l,int r,int s,int e){ if(s<=l && r<=e){ return sgt[nd]; } int ret=-1<<30; int mid=(r+l)/2; if(s<=mid){ ret=max(ret,query(2*nd,l,mid,s,e)); } if(mid+1<=e){ ret=max(ret,query(2*nd+1,mid+1,r,s,e)); } return ret; } void build2(int nd,int l,int r){ if(l==r){ sgt2[nd]=mn[l]; return; } int mid=(r+l)/2; build2(2*nd,l,mid); build2(2*nd+1,mid+1,r); sgt2[nd]=min(sgt2[2*nd],sgt2[2*nd+1]); } int query2(int nd,int l,int r,int s,int e){ if(s<=l && r<=e){ return sgt2[nd]; } int ret=1<<30; int mid=(r+l)/2; if(s<=mid){ ret=min(ret,query2(2*nd,l,mid,s,e)); } if(mid+1<=e){ ret=min(ret,query2(2*nd+1,mid+1,r,s,e)); } return ret; } int main(){ //cin.sync_with_stdio(false); //freopen("1.in","r",stdin); //freopen("11.out","w",stdout); fact[0]=inv[0]=1; for(int i=1;i<200100;i++){ fact[i]=(fact[i-1]*i)%mod; inv[i]=invv(fact[i]); } n=readPosIntSpace(); m=readPosIntLn(); assert(1<=n && n<=100000 && 1<=m && m<=100000); //cin>>n>>m; for(int i=1;i<=n;i++){ //cin>>mx[i]; if(i==n){ mx[i]=readPosIntLn(); } else { mx[i]=readPosIntSpace(); } assert(mx[i]%2==0 && 1<=mx[i] && mx[i]<=200000); } for(int i=1;i<=n;i++){ //cin>>mn[i]; if(i==n){ mn[i]=readPosIntLn(); } else { mn[i]=readPosIntSpace(); } assert(1<=mn[i] && mn[i]<=200000); } build(1,1,n); build2(1,1,n); while(m--){ int l,r; //cin>>l>>r; l=readPosIntSpace(); r=readPosIntLn(); assert(1<=l && l<=n && 1<=r && r<=n && l<=r); int nn=query(1,1,n,l,r); int kk=query2(1,1,n,l,r); nn/=2; kk--; long long sol=(C(2*nn-kk-2,nn-kk-1) * (kk+1))%mod; sol*=invv(nn); sol%=mod; cout<